package sessionBean;

import java.util.ArrayList;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entityBean.Agenzia;
import entityBean.Attrazione;
import entityBean.Cliente;
import entityBean.Hotel;
import entityBean.Operatore;
import entityBean.Pacchetto;
import entityBean.Volo;

/**
 * Session Bean implementation class LoginCtrl
 */
@Stateless(name = "LoginCtrl")
@Remote(LoginCtrlRemote.class)
public class LoginCtrl implements LoginCtrlRemote {

	@PersistenceContext(unitName="cvproject") 
	private EntityManager manager;

	/**
	 * Default constructor. 
	 */
	public LoginCtrl() {

		// TODO Auto-generated constructor stub

	}

	private Operatore getInfoOperatore(Operatore o) {

		//Prelevo tutte le BTP legate a quell'operatore

		String codice = o.getCodOp();

		String s = "FROM hotel h WHERE h.codiceop=:op";
		Query q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Hotel> hotels = new ArrayList<Hotel>(q.getResultList());

		s = "FROM volo v WHERE v.codoperatore=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Volo> voli = new ArrayList<Volo>(q.getResultList());

		s = "FROM attrazione a WHERE a.codiceop=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Attrazione> att = new ArrayList<Attrazione>(q.getResultList());

		o.setHotel(hotels);
		o.setVoli(voli);
		o.setAtt(att);

		return o;

	}

	private Cliente getInfoCliente(Cliente c) {

		String codice = c.getCodFis();

		try {

			//Cerco tutti i pacchetti che ha acquistato
			String s = "FROM pacchetto p WHERE p.acquirente=:codice";
			Query q = manager.createQuery(s);
			q.setParameter("codice", codice);

			ArrayList<Pacchetto> acquistati = new ArrayList<Pacchetto>(q.getResultList());

			c.setAcquistati(acquistati);

			return c;

		}
		catch(EntityNotFoundException e) {

			//Il cliente non ha ancora acquistato un pacchetto
			c.setAcquistati(null);

			return c;

		}

	}
	
	private Agenzia getInfoAgenzia(Agenzia a) {
		
		String codice = a.getPiva();
		
		try {
			
			String s = "FROM pacchetto p WHETE p.agenzia=:codice";
			Query q = manager.createQuery(s);
			q.setParameter("codice", codice);
			
			ArrayList<Pacchetto> pacchetti = new ArrayList<Pacchetto>(q.getResultList());
			
			a.setComposti(pacchetti);
			
			return a;
			
		}
		catch(EntityNotFoundException e) {
			
		    //L'agenzia non ha ancora composto pacchetti
			a.setComposti(null);
			
			return a;
			
		}
		
	}

	@Override
	public Operatore loginOperatore(String user, String password) {

		try {

			String s = "FROM operatore o WHERE o.codiceop =: user and o.password =: password";
			Query q = manager.createQuery(s);
			q.setParameter("user", user);
			q.setParameter("password", password);

			Operatore o = (Operatore) q.getSingleResult();

			return getInfoOperatore(o);

		}
		catch(EntityNotFoundException e) {

			Operatore o = new Operatore();

			o.setCodOp("NonTrovato");

			return o;

		}
		catch(NonUniqueResultException e) {

			return null;

		}

	}

	@Override
	public Agenzia loginAgenzia(String user, String password) {

		try {

			String s = "FROM agenzia a WHERE a.username =: username and a.password =: password";
			Query q = manager.createQuery(s);
			q.setParameter("username", user);
			q.setParameter("password", password);

			Agenzia a = (Agenzia) q.getSingleResult();

			return getInfoAgenzia(a);

		}
		catch(EntityNotFoundException e) {

			Agenzia a = new Agenzia();

			a.setUsername("NonTrovato");

			return a;

		}

		catch(NonUniqueResultException e) {

			return null;	

		}

	}

	@Override
	public Cliente loginCliente(String user, String password) {

		try {

			String s = "FROM cliente c WHERE c.username =: username and c.password =: password";
			Query q = manager.createQuery(s);
			q.setParameter("username", user);
			q.setParameter("password", password);

			Cliente c = (Cliente) q.getSingleResult();

			return getInfoCliente(c);

		}
		catch(EntityNotFoundException e) {

			Cliente c = new Cliente();

			c.setUsername("NonTrovato");

			return c;

		}
		catch(NonUniqueResultException e) {

			return null;

		}

	}

}
